package han.study.preparedstatement.blob;

import han.study.utils.JDBCUtils;
import org.junit.Test;

import java.sql.Connection;
import java.sql.PreparedStatement;

public class InsertTest {
    /**
     * 批量插入的方式
     * 1. addBatch(), executeBatch(), clearBatch()
     * 2. mysql默认不支持Batch的添加，可以通过在URL后面加上一个开启Batch添加参数
     */
    @Test
    public void testInsert2(){
        Connection conn = null;
        PreparedStatement ps = null;
        try{
            long start = System.currentTimeMillis();
            conn = JDBCUtils.getConnection();
            String sql = "insert into goods (name) values (?)";
            ps = conn.prepareStatement(sql);
            for(int i=1;i<20000;i++){
                ps.setObject(1,"name"+i);
                // 1."攒" sql
                ps.addBatch();
                if(i % 500 == 0){
                    //2.执行Batch
                    ps.executeBatch();
                    //3.清空Batch
                    ps.clearBatch();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.closeResource(conn,ps);
        }
    }

    /**
     * 批量插入的方式4，终极方案
     * 当数据执行插入的时候，数据库会自动提交数据
     * 可以控制数据提交的时间
     * 当数据执行完成后再进行提交
     */
    @Test
    public void testInsert4(){
        Connection conn = null;
        PreparedStatement ps = null;
        try{
            conn = JDBCUtils.getConnection();
            conn.setAutoCommit(false);
            String sql = "insert into goods (name) values (?)";
            ps = conn.prepareStatement(sql);
            for(int i=0;i<200000;i++){
                ps.setObject(1,"name"+i);
                ps.addBatch();
                if(i % 500 == 0){
                    ps.executeBatch();
                    ps.clearBatch();
                }
            }
            conn.commit();
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            JDBCUtils.closeResource(conn,ps);
        }
    }
}
